package com.sky.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration//这是一个信号。它告诉 Spring 框架：“我不是一个普通的 Java 类，我是一个配置类。请在项目启动时扫描我里面的内容，我可能会定义一些重要的组件。”
@Slf4j//它会自动帮你在这类里创建一个名为 log 的日志对象，这样你就可以直接用 log.info(...)、log.error(...) 等方法来打印日志，而不需要自己手动去写 private static final Logger log = ... 这行代码了。
public class RedisConfiguration {

    @Bean//这是整个文件最核心的注解。它用在方法上，告诉 Spring：“请执行这个方法，这个方法会返回一个对象。请把这个返回的对象当作一个重要的**组件（Bean）**来管理。” Spring 会把这个组件放到它的“容器”（可以想象成一个大工具箱）里。
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //这行代码就是利用 @Slf4j 提供的 log 对象打印一条日志，告诉开发者：“现在，我正要开始创建 RedisTemplate 了”。这在调试和监控程序运行时非常有用。
        log.info("开始创建redis模板对象...");
        //首先，创建一个全新的、空白的 RedisTemplate 对象。这就像从盒子里拿出了一个工具的毛坯。
        RedisTemplate redisTemplate = new RedisTemplate();

        //设置redis的连接工厂对象
        //这是关键的一步。把 Spring 递过来的“连接工厂”零件安装到 RedisTemplate 工具上。这样，RedisTemplate 就知道该去连接哪台 Redis 服务器了。
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //设置redis key的序列化器
        //背景：你在 Java 代码里操作的 key（键）通常是字符串（String），但 Redis 数据库存储的是二进制数据（bytes）。直接存进去，你在 Redis 客户端里可能会看到一堆乱码，而不是你想要的 "user:1" 这样的可读字符串。
        //作用：这行代码就是给 RedisTemplate 安装一个“翻译器”（序列化器）。StringRedisSerializer 这个翻译器专门负责把 Java 的字符串和你期望在 Redis 中看到的可读字符串进行双向转换。
        //效果：设置了它之后，当你用 redisTemplate.opsForValue().set("name", "zhangsan") 时，存到 Redis 里的 key 就是 "name"，而不是一串乱码。这极大地提升了可读性和可维护性。
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //组装完成！把这个配置好的 RedisTemplate 对象返回。Spring 接收到这个返回的对象后，就会把它妥善地保管在自己的“工具箱”（容器）里。
        return redisTemplate;
    }
}
